/* Arduino Fahrgestell mit Line-Tracking und Motortreiber L293B

The following sketch was created by Florian Kurth and Richard Huebl in September of 2011.


########################################################################
Der Motortreiber L293B
########################################################################
Der Motortreiberbaustein versorgt die Motoren mit der entsprechenden
Versorgungsspannung. Die Geschwindigkeit sowie die Drehrichtung der
Motoren können dabei über die digitalen Ports des Arduino eingestellt
werden.

Die Variablen für die Ports:
*/

int geschwindigkeit_R = 11;/*Geschwindigkeit des rechten Motors
                             mittels PWM (analogWrite();*/
int richtung_R1 = 13;
int richtung_R2 = 12;      /*Zur Richtungseinstellung des
                             rechten Motors (siehe Tabelle)*/
                             
int geschwindigkeit_L = 9;

int richtung_L1 = 8;
int richtung_L2 = 7;      /*analog zu rechter Seite

/*Die Ports müssen im Setup entsprechend gesetzt werden!

Wahrheitstabelle für die Motorrichtung:

richtung_*1  richtung_*2  geschwindichkeit  entspricht
  LOW         LOW            PWM              Motor bremsen
  LOW         HIGH           PWM              Motor dreht vorwärts
  HIGH        LOW            PWM              Motor dreht rückwärts
  egal        egal           LOW              Motor aus

Bei Richtungsänderungen müssen die Motoren immer erst gebremst werden!
Dies muss nicht sehr lange passieren. Wenn darauf verzichtet wird,
können die Motoren und der Schaltkreis Schaden nehmen!!!!

########################################################################
Die LineTracking Sensoren
########################################################################

Die Variablen für die Ports der Sensoren:
*/

int line_L = A1;            //linker LineTracking Sensor
int line_R = A0;            //rechter LineTracking Sensor

/*Die LineTracking liefern folgende Daten:
LOW --> Black
HIGH --> White
*/

boolean BB = false;

void check_BB(){
  while(digitalRead(10) != HIGH){ delay(100);}
  BB = true;
}

void setup()
{
/*Alle Ports für die Motoren auf OUTPU setzen!
*/
  pinMode (geschwindigkeit_R, OUTPUT);
  pinMode (richtung_R1,OUTPUT);
  pinMode (richtung_R2,OUTPUT);
  pinMode (geschwindigkeit_L,OUTPUT);
  pinMode (richtung_L1,OUTPUT);
  pinMode (richtung_L2, OUTPUT);
  pinMode(10, INPUT);
}

void loop(){

if(!BB) check_BB();

/* Motoren einstellen: vorwärts
*/
digitalWrite (richtung_R1, LOW);
digitalWrite (richtung_R2, HIGH);

digitalWrite (richtung_L1, HIGH);
digitalWrite (richtung_L2, LOW);

/* Die Geschwindigkeit bei den Motoren wird über das zweite
Argument von analogWrite() bestimmt.
*/

// Prüfen, ob die Linie mit dem linken Sensor überschritten wird.
if (analogRead(line_L) > 512)
{
  //Nein, Motor weiter laufen lassen
  analogWrite (geschwindigkeit_L,110);
}
else
{
  //Ja, Motor langsamer laufen lassen
  analogWrite (geschwindigkeit_L,50);
}
// Prüfen, ob die Linie mit dem rechten Sensor überschritten wird.
if (analogRead(line_R) > 512)
{
  //Nein, Motor weiter laufen lassen
  analogWrite (geschwindigkeit_R, 110);
}
else
{
  //Ja, Motor langsamer laufen lassen
  analogWrite (geschwindigkeit_R, 50);
}

/* Das Ganze hat eine Zickzacklinie zur Folge. Der Arduino pendelt
dabei von links nach rechts auf der Linie. Je nachdem wie groß
die Geschwindigkeiten gewählt werden, ist der Effekt größer oder nicht.
*/

  
  
}
